package Regular_expression_Case_package;

public class Regex_demo2 {
    public static void main(String[] args) {
        /*
        需求：
            请编写正则表达式验证用户名是否满足要求。
            要求：大小写字母，数字，下划线一共4-16位
        请编写正则表达式验证身份证号码是否满足要求。
            简单要求：18位，前17位任意数字，最后一位可以是数字可以是大写或小写的x
            复杂要求：按照身份证号码的格式

        身份证号码：
            吴海港 14042419861123283X
            汪少明 350122198009090517
            黄陈晓 331023199303277190
            邝建鸿 370103199302090953
         */

        //用户名要求：大小写字母，数字，下划线一共4-16位 [a-zA-Z0-9_]
        String regex1 = "\\w{4,16}";
        System.out.println("zhangsan".matches(regex1));
        System.out.println("$1234".matches(regex1));

        //身份证号码的简单校验：
        //18位，前17位任意数字，最后一位可以是数字可以是大写或小写的x
        String regex2 = "[1-9]\\d{16}(\\d|X|x)";
        System.out.println("14042419861123283X".matches(regex2));
        System.out.println("350122198009090517".matches(regex2));
        System.out.println("331023199303277190".matches(regex2));
        System.out.println("370103199302090953".matches(regex2));


        //忽略大小写的书写方式
        //在匹配的时候忽略bc的大小写
        String regex4 = "a(?i)bc";
        System.out.println("----------------------");
        System.out.println("abc".matches(regex4));
        System.out.println("ABC".matches(regex4));
        System.out.println("aBC".matches(regex4));


        //身份证号码的严格校验
        //编写正则的小心得：
        //第一步：按照正确的数据进行拆分
        //第二步：找每一部分的规律，并编写正则表达式
        //第三步：把每一部分的正则拼接在一起，就是最终的结果
        //书写的时候：从左到右去书写


        //14042419861123283X
        //前面6位：省份，市区，派出所等信息     第一位不能是0，后面5位是任意数字   [1-9]\\d{5}
        //年的前半段：18 19 20                                            (18|19|20)
        //年的后半段：任意数字出现两次                                        \\d{2}
        //月份： 12个月                                                   0[1-9]|1[0-2]
        //日期： 1～31                                                    0[1-9]|[12]\\d|3[01]
        //后面四位：任意数字出现3次，最后一位可以是数字也可以是大写X或者小写x       \\d{3}[\\dXx]
        String regex5 = "[1-9]\\d{5}(18|19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]";
        System.out.println("----------------------");
        System.out.println("14042419861123283X".matches(regex5));
        System.out.println("350122198009090517".matches(regex5));
        System.out.println("331023199303277190".matches(regex5));
        System.out.println("370103199302090953".matches(regex5));
    }
}
